﻿// See https://aka.ms/new-console-template for more information

/*
 * 我有个工厂，里面只生产大奔、宝马两种车
 * 客户来买车，客户需要知道这个车是具体怎么造出来的吗？ -- 不需要知道这个车怎么造出来的
 * 客户只需要告诉我，具体需要哪种车就可以了。
 * 
 * **/

//工厂 factory = new 工厂();
////var 车 =  factory.卖车("保时捷");
////车.Run();


//var _车 = 工厂.卖车("大奔");
//if (_车 != null)
//{
//    //_车.换装();
//    _车.Run();

//}
//else
//    Console.WriteLine("没有这个车");

//Console.WriteLine(typeof(string));


//var a = typeof(SystemUser);
//var ps = a.GetProperties();//属性
//string fieldsName = "";

//ps.ToList().ForEach(x => {
//    fieldsName += x.Name + ",";
//});

//string sql = $"select {fieldsName.TrimEnd(',')} from {a.Name}";
//Console.WriteLine(sql);

//var m =a.GetMethods(); //方法
//m.ToList().ForEach(t => {
//    System.Console.WriteLine( t.Name);
//    //t.Invoke(null, new object[] { });
//});

//var f = a.GetFields();//字段
//f.ToList().ForEach(x => {
//    global::System.Console.WriteLine(x.Name);
//});

//var p = a.GetProperties();//属性
//p.ToList().ForEach(x => {
//    global::System.Console.WriteLine(x.Name);
//});


//var c = a.GetConstructors();//构造
//c.ToList().ForEach(x => {
//    global::System.Console.WriteLine(x.Name);
//});

//var b = a.GetMembers();//成员
//b.ToList().ForEach(x => {
//    global::System.Console.WriteLine( x.Name);
//});


//var e = a.GetEvents();//事件
//e.ToList().ForEach(x => {
//    global::System.Console.WriteLine(x.Name);
//});


//var ase1 = System.Reflection.Assembly.Load("dll文件的相对路径");

////"dll文件的绝对路径"
//var ase2 = System.Reflection.Assembly.LoadFile(@"G:\ProgramCode\TeachingCode\2006A.PH6.0106_0217\Max.PH6_2006A.LowCode\Max.PH6_2006A.LowCode.Domain\bin\Debug\net6.0\Max.PH6_2006A.LowCode.Domain.dll");

////var ase3 = System.Reflection.Assembly.LoadFrom("可以是相对，也可以是绝对路径");
//var ts = ase2.GetTypes();
//ts.ToList().ForEach(t => {
//创建对象
//var s = Activator.CreateInstance(typeof(T));
//    //global::System.Console.WriteLine(t.Name);
//    //if(t.Name.Equals("SystemOrganizational"))
//    //{
//        var p = t.GetProperties();
//        p.ToList().ForEach(x => {
//            global::System.Console.WriteLine(x.Name);
//        });

//    global::System.Console.WriteLine("----------------");
//    //}
//});



using System.ComponentModel.DataAnnotations;

SystemUser user = new SystemUser
{
    Id = Guid.NewGuid(),
    NickName = "昵称"
};

string sql = InsertSql(user);

Console.WriteLine(sql);

Console.ReadKey();


string InsertSql(SystemUser user)
{
    string sql = "insert into 表名(字段1，字段2) values('值1'，'值2')";

    string tableName = "";
    string fieldName = "";
    string fieldValue = "";

    var t = user.GetType();

    tableName = t.Name;//前提：数据表名和实体的名称是一样的。

    t.GetProperties().ToList().ForEach(x =>
    {
        var v = x.GetValue(user, null);//属性值
        var n = x.Name; //属性名称
        if (v != null)
        {
            if (!n.ToLower().Equals("id"))
            {
                fieldName += n + ",";
                fieldValue += "'" + v + "',";
            }
        }
    });

    sql = $"insert into {tableName}({fieldName.TrimEnd(',')}) values({fieldValue.TrimEnd(',')})";
    return sql;
}


public delegate void MyDelegate(); //无参，无返回值的委托

public class SystemUser
{
    public event MyDelegate MyDelegate;
    public SystemUser() { }
    public SystemUser(string a) { }

    public string Test;

    [Key]
    /// <summary>
    /// 主健ID
    /// </summary>
    public Guid Id { get; set; }
    /// <summary>
    /// 登录名称
    /// </summary>
    public string? LoginName { get; set; }
    /// <summary>
    /// 密码（加密）
    /// </summary>
    public string? Password { get; set; }
    /// <summary>
    /// 昵称
    /// </summary>
    public string? NickName { get; set; }
    /// <summary>
    /// 状态(0正常，1禁用）
    /// </summary>
    public string? Statue { get; set; }
    /// <summary>
    /// 创建时间
    /// </summary>
    public DateTime? CreatedTime { get; set; } = System.DateTime.Now;
    /// <summary>
    /// 创建人（这个用户是由谁添加的）
    /// </summary>
    public string? CreatedBy { get; set; }

    public int Age { get; set; }

    /// <summary>
    /// 修改时间
    /// </summary>
    public DateTime UpdatedTime { get; set; }
    /// <summary>
    /// 修改人
    /// </summary>
    public string? UpdatedBy { get; set; }
}

public class 工厂
{
    private static 车 _车;

    public static 车 卖车(string 什么类型的车)
    {
        if (什么类型的车.Equals("大奔"))
        {
            _车 = new 大奔();
        }
        else if (什么类型的车.Equals("宝马"))
        {
            _车 = new 宝马();
        }
        else
        {
            _车 = null;
        }
        return _车;
    }
}


public abstract class 车
{
    public abstract void Run();
    public void 换装()
    {
        Console.WriteLine("我换成红色了");
    }
}

public class 大奔 : 车
{
    //public void Run()
    //{
    //    Console.WriteLine("我是大奔，我每小时能跑100公里");
    //}

    public override void Run()
    {
        Console.WriteLine("我是大奔，我每小时能跑100公里");
    }

    public new void 换装()
    {
        Console.WriteLine("我是大奔，蓝色");
    }
}

public class 宝马 : 车
{
    public override void Run()
    {
        Console.WriteLine("我是宝马，我每小时能跑120公里");
    }
}